#include <iostream>
#include <string>
#include <unistd.h>
#include <cstdlib>
#include <pthread.h>
#include <thread>

std::string toHex(pthread_t tid)
{
    char Hex[64];
    snprintf(Hex, sizeof(Hex), "%p", tid);
    return Hex;
}

void *pthreadRoutine(void *args)
{
    while (true)
    {
        std::cout << "new thread tid : " << toHex(pthread_self()) << std::endl;
        sleep(1);
    }
}

// 查看线程的tid
int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, pthreadRoutine, (void *)"Thread 1");

    std::cout << "main thread creat new thread done tid : " << toHex(tid) << std::endl;
    sleep(1);

    pthread_join(tid, nullptr);

    return 0;
}

// pthread是Linux原生线程库
// C++11也提供了线程库，是对原生线程库的封装！！

// void threadrun()
// {
//     while(true)
//     {
//         std::cout << "I am a new thead for C++" << std::endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     std::thread t1(threadrun);

//     t1.join();

//     return 0;

// }

// class Request
// {
// public:
//     Request(int start, int end, const std::string &threadname)
//         : _start(start), _end(end), _threadname(threadname)
//     {
//     }

// public:
//     int _start;
//     int _end;
//     std::string _threadname;
// };

// class Response
// {
// public:
//     Response(int result, int exitcode)
//         : _result(result), _exitcode(exitcode)
//     {
//     }

// public:
//     int _result;
//     int _exitcode;
// };

// void *sumCount(void *args)  //线程的参数和返回值，不仅仅可以用来进行传递一般参数，也可以传递对象！！
// {
//     Request *rq = static_cast<Request *>(args);
//     Response *rsp = new Response(0, 0);
//     for (int i = rq->_start; i <= rq->_end; i++)
//     {
//         std::cout << rq->_threadname << " is runing, caling..., " << i << std::endl;
//         rsp->_result += i;
//     }
//     delete rq;
//     return rsp;
// }

// int main()
// {
//     pthread_t tid;
//     Request *rq = new Request(1, 100, "Thread 1");
//     pthread_create(&tid, nullptr, sumCount, rq);

//     void *ret;
//     pthread_join(tid, &ret);
//     Response *rsp = static_cast<Response *>(ret);
//     std::cout << "rsp->result: " << rsp->_result << ", exitcode: " << rsp->_exitcode << std::endl;
//     delete rsp;

//     return 0;
// }
